<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" 
  elementFormDefault="qualified" targetNamespace="urn:ihe:iti:csd:2013" xmlns="urn:ihe:iti:csd:2013"
  xmlns:xml="http://www.w3.org/XML/1998/namespace">
  <xs:import namespace="http://www.w3.org/2001/XMLSchema"
    schemaLocation="http://www.w3.org/2001/XMLSchema.xsd"/>
  <xs:import namespace="http://www.w3.org/2002/xforms"
    schemaLocation="http://www.w3.org/MarkUp/Forms/2002/XForms-Schema.xsd"/>
  <xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
 
  <!-- [ROR] Extention of organization to include commentOnCreation, landingArea, location and metadata-->
  <xs:redefine schemaLocation="CSD.xsd">
    <xs:complexType name="organization">
      <xs:complexContent>
        <xs:extension base="organization">
          <xs:sequence>
            <xs:element name="commentOnCreation" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="landingArea" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
            <xs:element name="location" type="location" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>   
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
  
  <!-- [ROR] Extension of facility to include comment, location, typeOfCare, accomodationCapacity, patientsType and metadata-->
  <xs:redefine schemaLocation="CSD.xsd">
    <xs:complexType name="facility">
      <xs:complexContent>
        <xs:extension base="facility">
          <xs:sequence>
            <xs:element name="comment" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="location" type="location" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="typeOfCare" type="codedtype" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="parentFacility" type="uniqueID" minOccurs="0" maxOccurs="1"/>
            <xs:element name="accomodationCapacity" type="accomodationcapacity" minOccurs="0" maxOccurs="1"/>
            <xs:element name="patientType" type="patienttype" minOccurs="1" maxOccurs="unbounded"/>
            <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>   
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
  
  <!-- [ROR] Extension of service to include specialty, act and link to devices -->
  <xs:redefine schemaLocation="CSD.xsd">
    <xs:complexType name="service">
      <xs:complexContent>
        <xs:extension base="service">
          <xs:sequence>
            <xs:element name="specialty" type="codedtype" minOccurs="1" maxOccurs="unbounded"/>
            <xs:element name="act" type="codedtype" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="equipment" type="uniqueID" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/> 
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
  
  <!-- [ROR] [Extension of CSD schema] Extension of person to include function, description, type and metadata --> 
  <xs:redefine schemaLocation="CSD.xsd">
    <xs:complexType name="person">
      <xs:complexContent>
        <xs:extension base="person">
          <xs:sequence>
            <xs:element name="function" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="type" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="location" type="location" minOccurs="0" maxOccurs="1"/>
            <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
  
  <!-- [ROR] [Extension of CSD schema] Extension of operationHours to metadata --> 
  <xs:redefine schemaLocation="CSD.xsd">
    <xs:complexType name="operatingHours">
      <xs:complexContent>
        <xs:extension base="operatingHours">
          <xs:sequence>
            <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
  
  <!-- [ROR] [Extension of CSD schema] Extension of contactPoint to metadata --> 
  <xs:redefine schemaLocation="CSD.xsd">
    <xs:complexType name="contactPoint">
      <xs:complexContent>
        <xs:extension base="contactPoint">
          <xs:sequence>
            <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
  
  <!-- [ROR] Extension to code address' attributes and metadata - added attributes are derived from UN/CEFACT -->
  
  <xs:redefine schemaLocation="CSD.xsd">
    <xs:complexType name="address">
      <xs:complexContent>
        <xs:extension base="address">
          <xs:sequence>
            <xs:element name="addressLine" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attributeGroup ref="addressAttribute" />
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
            <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>
  
  <!-- [ROR] [Extension on CSD schema] Extension to include a Device directory -->
  
  <xs:redefine schemaLocation="CSD.xsd">
    <xs:complexType name="CSD">
      <xs:complexContent>
        <xs:extension base="CSD">
          <xs:sequence>
            <xs:element name="deviceDirectory">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="device" type="device" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:redefine>

 <!-- [ROR] Added types for ROR -->
  <xs:attributeGroup name="addressAttribute">
    <xs:attribute name="inHouseMail" type="xs:string" use="optional"/>
    <xs:attribute name="buildingName" type="xs:string" use="optional"/>
    <xs:attribute name="buildingNumber" type="xs:string" use="optional"/>
    <xs:attribute name="blockName" type="xs:string" use="optional"/>
    <xs:attribute name="streetType" type="xs:string" use="optional"/>
    <xs:attribute name="streetName" type="xs:string" use="optional"/>
    <xs:attribute name="plotIdentification" type="xs:string" use="optional"/>
    <xs:attribute name="postOfficeBox" type="xs:string" use="optional"/>
    <xs:attribute name="postCode" type="xs:string" use="optional"/>
    <xs:attribute name="cityName" type="xs:string" use="optional"/>
    <xs:attribute name="citySubDivisionName" type="xs:string" use="optional"/>
    <xs:attribute name="type" type="xs:string" use="optional"/>
    <xs:attribute name="addressLineOne" type="xs:string" use="optional"/>
    <xs:attribute name="addressLineTwo" type="xs:string" use="optional"/>
    <xs:attribute name="addressLineThree" type="xs:string" use="optional"/>
    <xs:attribute name="addressLineFour" type="xs:string" use="optional"/>
    <xs:attribute name="addressLineFive" type="xs:string" use="optional"/>
    <xs:attribute name="addressLineSix" type="xs:string" use="optional"/>
    <xs:attribute name="countryName" type="xs:string" use="optional"/>          
  </xs:attributeGroup>
  
  
  <xs:complexType name="metadata">
    <xs:sequence>
      <xs:element name="otherID" type="otherID" minOccurs="0" maxOccurs="unbounded"/>              
      <xs:element name="version" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="registrationAuthority" type="codedtype" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="updated" type="xs:date" minOccurs="0" maxOccurs="1"/>      
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="mesure">
    <xs:sequence>
      <xs:element name="content" type="xs:string" minOccurs="0" maxOccurs="1"/>              
      <xs:element name="unit" type="codedtype" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="geocoordinates">
    <xs:sequence>
      <xs:element name="geodeticSystem" type="otherID" minOccurs="1" maxOccurs="1"/>
      <xs:element name="altimetricSystem" type="otherID" minOccurs="0" maxOccurs="1"/>
      <xs:element name="geoLatitude" type="mesure" minOccurs="1" maxOccurs="1"/>
      <xs:element name="geoLatitudeDirection" type="codedtype" minOccurs="1" maxOccurs="1"/>
      <xs:element name="geoLongitude" type="mesure" minOccurs="1" maxOccurs="1"/>
      <xs:element name="geoLongitudeDirection" type="codedtype" minOccurs="1" maxOccurs="1"/>
      <xs:element name="geoAltitude" type="mesure" minOccurs="0" maxOccurs="1"/>
      <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="location">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="description" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="physicalType" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="status" type="codedtype" minOccurs="0" maxOccurs="1"/>
      <xs:element name="accessibility" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="geoCoordinates" type="geocoordinates" minOccurs="0" maxOccurs="1"/>
      <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
 
  <xs:complexType name="device">
    <xs:complexContent>
      <xs:extension base="uniqueID">
        <xs:sequence>
          <xs:element name="type" type="codedtype" minOccurs="1" maxOccurs="1"/>
          <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1"/>
          <xs:element name="identifier" type="otherID" minOccurs="0" maxOccurs="unbounded"/>
          <xs:element name="expiry" type="xs:dateTime" minOccurs="0" maxOccurs="unbounded"/>
          <xs:element name="effectiveDate" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:attribute name="start" type="xs:dateTime"/>
              <xs:attribute name="stop" type="xs:dateTime"/>
            </xs:complexType>
          </xs:element>
          <xs:element name="inService" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
          <xs:element name="extension" type="extension" minOccurs="0" maxOccurs="unbounded"/>
          <xs:element name="record" type="record"/>
          <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>    
  </xs:complexType>
  
  <xs:complexType name="accomodationcapacity">
    <xs:sequence>
      <xs:element name="beds" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:attribute name="total" type="xs:integer"/>
          <xs:attribute name="available" type="xs:integer"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="space" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:attribute name="total" type="xs:integer"/>
          <xs:attribute name="available" type="xs:integer"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>   
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="patienttype">
    <xs:sequence>
      <xs:element name="ageGroup" type="codedtype" minOccurs="1" maxOccurs="1"/>              
      <xs:element name="patientGroup" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="1"/>   
    </xs:sequence>
  </xs:complexType>
 

  <xs:element name="CSD" type="CSD"/>

  <!-- [ROR] request and response taken from CSD schema without change expect deletion of annotations to ease up the reading-->
  <xs:element name="careServicesRequest">
    <xs:complexType>      
        <xs:element name="function">
          <xs:complexType>
            <xs:sequence>
              <xs:any minOccurs="0" namespace="##any" processContents="skip"/>
            </xs:sequence>
            <xs:attribute name="uuid" use="required" type="uuid"/>
            <xs:attribute name="encapsulated" type="xs:boolean" use="required"/>
            <xs:anyAttribute/>
          </xs:complexType>
        </xs:element>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="careServicesResponse">
    <xs:complexType>
      <xs:choice>
        <xs:element name="error">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="code" type="xs:integer"/>
                <xs:anyAttribute/>                
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="result" type="xs:anyType"/>
      </xs:choice>
      <xs:attribute name="content-type" type="xs:string"/>      
      <xs:anyAttribute/>      
    </xs:complexType>
  </xs:element>
  
  <xs:element name="careServicesFunction">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="description" minOccurs="0" type="xs:anyType"/>        
        <xs:element name="definition">          
          <xs:complexType>
            <xs:complexContent>
              <xs:extension base="xs:anyType">
                <xs:anyAttribute/>                
              </xs:extension>
            </xs:complexContent>
          </xs:complexType>
        </xs:element>
        <xs:element ref="xforms:instance" minOccurs="0"/>
        <xs:element ref="xs:schema" minOccurs="0" maxOccurs="1"/>
        <xs:element ref="xforms:bind" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element maxOccurs="unbounded" minOccurs="0" name="extension" type="extension"/>
      </xs:sequence>
      <xs:attribute name="uuid" use="required" type="uuid"/>      
      <xs:attribute name="content-type" type="xs:string" use="required"/>      
      <xs:attribute name="schema" type="xforms:anyURIList" use="optional"/>
      <xs:anyAttribute/>      
    </xs:complexType>
  </xs:element>

</xs:schema>

